#ifndef STRING_H
#define STRING_H

#include <iostream>
#include <cstring>
class StringIterator{
public:
	//默认构造函数
	StringIterator() : ptr(nullptr){ }
	//带参构造函数
	StringIterator(char* p) : ptr(p) { }
	//重载运算符
	//前置和后置递增运算符
	StringIterator& operator++(){
		++ptr;
		return *this;
	}
	StringIterator operator++(int) {
		StringIterator temp = *this;
		++(*this);
		return temp; 
	}
	
	//前置和后置递减运算符
	StringIterator& operator--(){
		--ptr;
		return *this;
	}
	// 后置递减运算符重载，修改返回值为StringIterator而非引用
	StringIterator operator--(int) {
		StringIterator temp = *this;
		--(*this);
		return temp; 
	}
	//获取当前指向的字符
	char operator*(){
		return *ptr;
	}
	//判断当前指向的字符是否相等
	bool operator==(const StringIterator& rhs){
		return *ptr == *(rhs.ptr);
	}
	bool operator!=(const StringIterator& rhs){
		return !(*this == rhs); //调用重载的==运算符进行取反
	}
	//获取当前指针
	char* getPtr(){
		return ptr;
	}
private:
	char *ptr; //指向当前遍历到字符的位置
};

class String {
	friend std::ostream& operator<<(std::ostream& os, const String& str);
public:
	//默认构造函数
	String() : data(nullptr), length(0){ }
	//带参数的构造函数
	String(const char*);
	//拷贝构造
	explicit String(const String&);
	//拷贝赋值
	String& operator=(const String&);
	//移动拷贝构造
	String(String&&) noexcept;
	//移动赋值
	String& operator=(String&&) noexcept;
	//析构函数
	~String(){ delete[] data;}
	//获取字符串长度
	size_t getLength() const { return length;}
	//判断字符串是否为空
	bool empty(){ return length == 0;}
	//通过下标访问字符串中的字符：只读/可写
	char& operator[](size_t index){
		return data[index];
		//*((data + 0) + index)
	}
	const char& operator[](size_t index) const{
		return data[index];
	}
	//追加操作
	String& operator+=(const String&);
	//转换为c风格字符串
	char* char_c(){
		char* c_str = new char[length + 1];
		std::strcpy(c_str, data);
		return c_str;
	}
	
	// 返回指向字符串起始位置的迭代器
	StringIterator begin() {
		return StringIterator(data);
	}
	
	// 返回指向字符串结束位置的迭代器
	StringIterator end() {
		return StringIterator(data + length);
	}
	// 使用迭代器插入字符
	StringIterator insert(StringIterator pos, char ch);
	// 新增接受索引值的 insert 重载版本

	StringIterator insert(size_t index, char ch);
	
private:
	char *data;
	size_t length;
	
};



#endif
